/**
 * 公共处理文件
 * author: jooiForest
 * date: 2022/6/21
*/

module.exports = {
  /**
  * 根据参数设置坐标
  * 'GCJ-02':Google Map、高德、腾讯使用
  * 'WGS-84':是国际标准，GPS坐标,天地图
  * 'BD-09':百度坐标偏移标准
  * 
  * geojson 数据结构
  * {
  *    features: [
  *       {
  *          geometry: {
  *             type: 'LineString', 'Point' , 'Polygon'
  *             coordinates: [[lng, lat], [lng, lat]] , [lng, lat] , [[[lng, lat], [lng, lat]]]
  *          }
  *        }
  *    ]
  * }
  * 
  * parms{
  *   transform:'', WGS-GCJ: 国际转高德  GCJ-WGS: 高德转国际
  *   geojson:{}
  * }
  */
  setTransform(params){
    // console.log('hav', getS())
    let _json = params.geojson;
    let _transform = params.transform;
    if(typeof _json == 'string'){
      _json = JSON.parse(_json)
    }
    if(_json.features){
      for(let i in _json.features){
        let _geometry = _json.features[i].geometry;

        _geometry = toSetGeometryByType(_geometry, _transform)
      }
    }
    
    return _json
  }
}



/**
 * 根据数据类型进行单独处理
 * geometry.type: 'LineString', 'Point' , 'Polygon'
 * geometry.coordinates: []
 */
const toSetGeometryByType = function(geometry, transform){
  let _geo = geometry
  switch(geometry.type){
    case 'Point':
      _geo.coordinates = fnSetPositionByType(_geo.coordinates, transform)
    case 'LineString':
      for(let i in _geo.coordinates){
        _geo.coordinates[i] = fnSetPositionByType(_geo.coordinates[i], transform)
      }
    case 'Polygon':
      for(let i in _geo.coordinates[0]){
        _geo.coordinates[0][i] = fnSetPositionByType(_geo.coordinates[0][i], transform)
      }
    break;
  }
  console.log(_geo)
  return _geo;
}


/**
 * 根据坐标和类型处理转换
*/
const fnSetPositionByType = function(array, transform){
  let _array = array;
  switch(transform){
    case 'WGS-GCJ':
      _array = COMMON_API.fnWGSToGCJ(_array[0], _array[1])
    case 'GCJ-WGS':
      _array = COMMON_API.fnGCJToWGS(_array[0], _array[1])
    break;
  }
  console.log(_array)
  return _array;
}



/**
* 以下为坐标系转换方法
* COMMON_API: 操作对象
*/
const COMMON_API = {}

COMMON_API.PI = 3.14159265358979324
COMMON_API.x_pi = 3.14159265358979324 * 3000.0 / 180.0
COMMON_API.a = 6378245.0;
COMMON_API.ee = 0.00669342162296594323;

//GCJ-02 to WGS-84
COMMON_API.fnGCJToWGS = (lng, lat) => {
    if (COMMON_API.fnOutOfChina(lng, lat)) {
        return [lng, lat]
    }else {
        var dlat = COMMON_API.transformLat(lng - 105.0, lat - 35.0);
        var dlng = COMMON_API.transformLon(lng - 105.0, lat - 35.0);
        var radlat = lat / 180.0 * COMMON_API.PI;
        var magic = Math.sin(radlat);
        magic = 1 - COMMON_API.ee * magic * magic;
        var sqrtmagic = Math.sqrt(magic);
        dlat = (dlat * 180.0) / ((COMMON_API.a * (1 - COMMON_API.ee)) / (magic * sqrtmagic) * COMMON_API.PI);
        dlng = (dlng * 180.0) / (COMMON_API.a / sqrtmagic * Math.cos(radlat) * COMMON_API.PI);
        let mglat = lat + dlat;
        let mglng = lng + dlng;
        return [lng * 2 - mglng, lat * 2 - mglat]
    }
}

//WGS-84 to GCJ-02
COMMON_API.fnWGSToGCJ = (lng, lat) => {
    var lat = +lat;
    var lng = +lng;
    if (COMMON_API.fnOutOfChina(lng, lat)) {
        return [lng, lat]
    } else {
        var dlat = COMMON_API.transformLat(lng - 105.0, lat - 35.0);
        var dlng = COMMON_API.transformLon(lng - 105.0, lat - 35.0);
        var radlat = lat / 180.0 * COMMON_API.PI;
        var magic = Math.sin(radlat);
        magic = 1 - COMMON_API.ee * magic * magic;
        var sqrtmagic = Math.sqrt(magic);
        dlat = (dlat * 180.0) / ((COMMON_API.a * (1 - COMMON_API.ee)) / (magic * sqrtmagic) * COMMON_API.PI);
        dlng = (dlng * 180.0) / (COMMON_API.a / sqrtmagic * Math.cos(radlat) * COMMON_API.PI);
        var mglat = lat + dlat;
        var mglng = lng + dlng;
        return [mglng, mglat]
    }
}

COMMON_API.transformLat = (lng, lat) => {
    var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
    ret += (20.0 * Math.sin(6.0 * lng * COMMON_API.PI) + 20.0 * Math.sin(2.0 * lng * COMMON_API.PI)) * 2.0 / 3.0;
    ret += (20.0 * Math.sin(lat * COMMON_API.PI) + 40.0 * Math.sin(lat / 3.0 * COMMON_API.PI)) * 2.0 / 3.0;
    ret += (160.0 * Math.sin(lat / 12.0 * COMMON_API.PI) + 320 * Math.sin(lat * COMMON_API.PI / 30.0)) * 2.0 / 3.0;
    return ret
}
COMMON_API.transformLon = (lng, lat) => {
    var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
    ret += (20.0 * Math.sin(6.0 * lng * COMMON_API.PI) + 20.0 * Math.sin(2.0 * lng * COMMON_API.PI)) * 2.0 / 3.0;
    ret += (20.0 * Math.sin(lng * COMMON_API.PI) + 40.0 * Math.sin(lng / 3.0 * COMMON_API.PI)) * 2.0 / 3.0;
    ret += (150.0 * Math.sin(lng / 12.0 * COMMON_API.PI) + 300.0 * Math.sin(lng / 30.0 * COMMON_API.PI)) * 2.0 / 3.0;
    return ret
}


// out of china
COMMON_API.fnOutOfChina = (lng, lat) => {
    return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false)
}